home *** CD-ROM | disk | FTP | other *** search
/ AGA Toolkit '97 / The AGA Toolkit '97.iso / programming / gui / gadutil / examples / bettertest-c / bettertest.c next >
Encoding:
C/C++ Source or Header  |  1996-09-07  |  11.5 KB  |  423 lines

  1. /*------------------------------------------------------------------------**
  2. **              My gadutil.library example translated into C              **
  3. **                                          P-O Yliniemi 24-Dec-94        **
  4. **------------------------------------------------------------------------*/
  5. #define INTUI_V36_NAMES_ONLY
  6.  
  7. #include <exec/types.h>
  8. #include <exec/execbase.h>
  9. #include <intuition/intuition.h>
  10. #include <intuition/gadgetclass.h>
  11. #include <libraries/gadtools.h>
  12.  
  13. #include <libraries/gadutil.h>
  14. #include <proto/gadutil.h>
  15.  
  16. #include <clib/dos_protos.h>
  17. #include <clib/exec_protos.h>
  18. #include <clib/intuition_protos.h>
  19. #include <clib/gadtools_protos.h>
  20.  
  21. #include <stdio.h>
  22.  
  23. #ifdef LATTICE
  24. int CXBRK(void)     { return(0); }
  25. int chkabort(void)  { return(0); }
  26. #endif
  27.  
  28. extern struct ExecBase *SysBase;
  29.  
  30. /*-------------------- Data for localizing of the program ----------------*/
  31. #define DRIVE_MX_GAD    11
  32.  
  33. #define MSG_NEXTDRIVE    0
  34. #define MSG_PREVDRIVE    1
  35. #define MSG_DRIVE        2
  36. #define MSG_CHECKME        3
  37. #define MSG_REQUESTER    4
  38. #define MSG_FILENAME    5
  39. #define MSG_INTEGER        6
  40. #define MSG_DRAGME        7
  41. #define MSG_SCROLLME    8
  42. #define MSG_SELECTITEM    9
  43. #define MSG_SELECTCOL    10
  44.  
  45. #define MNU_1_TITLE        100
  46. #define MNI_1_IT1        101
  47. #define MNI_1_IT2        102
  48. #define MNI_1_IT3        103
  49. #define MNS_1_IT3_1        104
  50. #define MNS_1_IT3_2        105
  51. #define MNI_1_IT4        106
  52.  
  53. static const struct AppString AppStrings[] =
  54. {
  55.     {MSG_NEXTDRIVE, (ULONG)"_Next drive"},
  56.     {MSG_PREVDRIVE, (ULONG)"_Prev drive"},
  57.     {MSG_DRIVE, (ULONG)"_Drive"},
  58.     {MSG_CHECKME, (ULONG)"C_heck me:"},
  59.     {MSG_REQUESTER, (ULONG)"_Requester"},
  60.     {MSG_FILENAME, (ULONG)"_Filename:"},
  61.     {MSG_INTEGER, (ULONG)"_Integer:"},
  62.     {MSG_DRAGME, (ULONG)"Dra_g me:"},
  63.     {MSG_SCROLLME, (ULONG)"Scr_oll me:"},
  64.     {MSG_SELECTITEM, (ULONG)"_Select an item:"},
  65.     {MSG_SELECTCOL, (ULONG)"Select _Color:"},
  66.     {MNU_1_TITLE, (ULONG)" \0Project"},
  67.     {MNI_1_IT1, (ULONG)"O\0Open..."},
  68.     {MNI_1_IT2, (ULONG)"S\0Save"},
  69.     {MNI_1_IT3, (ULONG)" \0Print"},
  70.     {MNS_1_IT3_1, (ULONG)" \0Draft"},
  71.     {MNS_1_IT3_2, (ULONG)" \0NLQ"},
  72.     {MNI_1_IT4, (ULONG)"Q\0Quit"},
  73. };
  74.  
  75. #define catalogname "BetterTest.catalog"
  76.  
  77. /*----------------------- End of localizing datas ------------------------*/
  78.  
  79. struct TagItem layoutmenutags[] = {
  80.     GTMN_NewLookMenus,    TRUE,
  81.     TAG_DONE
  82. };
  83.  
  84. #define LEFT_OFFSET    6
  85. #define TOP_OFFSET    3
  86.  
  87. struct TagItem StdGTTags[] = {
  88.     GT_Underscore, '_',
  89.     TAG_DONE
  90. };
  91.  
  92. struct TagItem StdButtonTags[] = {
  93.     GU_Flags,    PLACETEXT_IN,    GU_LabelHotkey,    TRUE,    TAG_DONE
  94. };
  95.  
  96. struct TagItem StdGadTags[] = {
  97.     GU_LabelHotkey,    TRUE,    TAG_DONE
  98. };
  99.  
  100. struct TagItem NextDriveGad[] = {
  101.     GU_GadgetKind,    BUTTON_KIND,    GU_LocaleText,    MSG_NEXTDRIVE,
  102.     GU_Left,    LEFT_OFFSET,    GU_Top,        TOP_OFFSET,
  103.     GU_AutoHeight,    4,        GU_AutoWidth,    20,
  104.     TAG_MORE,    (ULONG)StdButtonTags
  105. };
  106.  
  107. struct TagItem PrevDriveGad[] = {
  108.     GU_GadgetKind,    BUTTON_KIND,    GU_LocaleText,    MSG_PREVDRIVE,
  109.     GU_DupeWidth,    MSG_NEXTDRIVE,    GU_LeftRel,    MSG_NEXTDRIVE,
  110.     GU_AddLeft,    INTERWIDTH,    TAG_MORE,    (ULONG)StdButtonTags
  111. };
  112.  
  113. struct TagItem DriveGad[] = {
  114.     GU_GadgetKind,    CYCLE_KIND,    GU_LocaleText,    MSG_DRIVE,
  115.     GU_TopRel,    MSG_PREVDRIVE,    GU_AddTop,        INTERHEIGHT,
  116.     GU_Flags,    PLACETEXT_LEFT,    TAG_MORE,        (ULONG)StdGadTags
  117. };
  118.  
  119. APTR CycleText[] = { "DF0:", "DF1:", "DF2:", "DF3:", NULL };
  120.  
  121. struct TagItem DriveGTTags[] = {
  122.     GTCY_Labels,    (ULONG)CycleText,    TAG_MORE,    (ULONG)StdGTTags
  123. };
  124.  
  125. struct TagItem ReqGad[] = {
  126.     GU_GadgetKind,    BUTTON_KIND,    GU_LocaleText,    MSG_REQUESTER,
  127.     GU_TopRel,    MSG_DRIVE,    GU_AddTop,    INTERHEIGHT,
  128.     TAG_MORE,    (ULONG)StdButtonTags
  129. };
  130.  
  131. struct TagItem CheckBoxGad[] = {
  132.     GU_Width,    CHECKBOX_WIDTH,    GU_Height,    CHECKBOX_HEIGHT,
  133.     GU_GadgetKind,    CHECKBOX_KIND,    GU_LocaleText,    MSG_CHECKME,
  134.     GU_AlignRight,    MSG_NEXTDRIVE,    GU_Flags,    PLACETEXT_LEFT,
  135.     TAG_MORE,    (ULONG)StdGadTags
  136. };
  137.  
  138. struct TagItem FileNameGad[] = {
  139.     GU_GadgetKind,    STRING_KIND,    GU_TopRel,    MSG_REQUESTER,
  140.     GU_LocaleText,    MSG_FILENAME,    GU_AutoHeight,    4,
  141.     GU_AlignLeft,    MSG_CHECKME,    GU_AlignRight,    DRIVE_MX_GAD,
  142.     GU_AddTop,    INTERHEIGHT,    GU_AddWidth,    4,
  143.     TAG_MORE,    (ULONG)StdGadTags
  144. };
  145.  
  146. struct TagItem IntegerGad[] = {
  147.     GU_GadgetKind,    INTEGER_KIND,    GU_TopRel,    MSG_FILENAME,
  148.     GU_LocaleText,    MSG_INTEGER,    GU_AddTop,    INTERHEIGHT,
  149.     TAG_MORE,    (ULONG)StdGadTags
  150. };
  151.  
  152. struct TagItem DriveMxGad[] = {
  153.     GU_GadgetKind,    MX_KIND,    GU_AlignTop,    MSG_NEXTDRIVE,
  154.     GU_Width,    MX_WIDTH,    GU_Height,    MX_HEIGHT,
  155.     GU_AdjustTop,    2,        GU_Flags,    PLACETEXT_LEFT|NG_HIGHLABEL,
  156.     GU_LeftRel,    MSG_PREVDRIVE,    GU_AddLeftChar,    7,
  157.     GU_GadgetText,    (ULONG)"Driv_e",GU_LabelHotkey,    TRUE,
  158.     TAG_DONE
  159. };
  160.  
  161. struct TagItem MXGadGTTags[] = {
  162.     GTMX_Labels,    (ULONG)CycleText,    GTMX_Spacing,    2,
  163.     GTMX_Active,    2,            TAG_DONE
  164. };
  165.  
  166. struct TagItem SliderGad[] = {
  167.     GU_GadgetKind,    SLIDER_KIND,    GU_AlignLeft,    MSG_FILENAME,
  168.     GU_AlignRight,    MSG_FILENAME,    GU_AutoHeight,    4,
  169.     GU_TopRel,    MSG_INTEGER,    GU_AddTop,    INTERHEIGHT,
  170.     GU_AddWidth,    -13,        GU_Flags,    PLACETEXT_LEFT,
  171.     GU_LocaleText,    MSG_DRAGME,    TAG_MORE,    (ULONG)StdGadTags
  172. };
  173.  
  174. struct TagItem SliderGTTags[] = {
  175.     GTSL_Min,        -50,            GTSL_Max,    50,
  176.     GTSL_Level,        10,            GTSL_MaxLevelLen, 3,
  177.     GTSL_LevelFormat,    (ULONG)"%3ld",
  178.     GTSL_LevelPlace,    PLACETEXT_RIGHT,
  179.     TAG_MORE,        (ULONG)StdGTTags
  180. };
  181.  
  182. struct TagItem ListViewGad[] = {
  183.     GU_GadgetKind,    LISTVIEW_KIND,    GU_AlignTop,    MSG_DRIVE,
  184.     GU_AlignBottom,    MSG_INTEGER,    GU_LocaleText,    MSG_SELECTITEM,
  185.     GU_LeftRel,    MSG_INTEGER,    GU_Columns,    26,
  186.     GU_Flags,    PLACETEXT_ABOVE|NG_HIGHLABEL,
  187.     GU_AddLeft,    10,        TAG_MORE,    (ULONG)StdGadTags
  188. };
  189.  
  190. struct TagItem LVGTTags[] = {
  191.     GTLV_Labels,    NULL,        GTLV_ShowSelected,    -1L,
  192.     TAG_MORE,    (ULONG)StdGTTags
  193. };
  194.  
  195. struct TagItem ScrollGad[] = {
  196.     GU_GadgetKind,    SCROLLER_KIND,    GU_LocaleText,    MSG_SCROLLME,
  197.     GU_AlignLeft,    MSG_DRAGME,    GU_AlignRight,    MSG_INTEGER,
  198.     GU_TopRel,    MSG_DRAGME,    GU_AddTop,    INTERHEIGHT,
  199.     GU_Flags,    PLACETEXT_LEFT,    GU_AddWidth,    20,
  200.     GU_DupeHeight,    MSG_DRAGME,    TAG_MORE,    (ULONG)StdGadTags
  201. };
  202.  
  203. struct TagItem ScrollGTTags[] = {
  204.     GTSC_Top,    110,        GTSC_Total,    9,
  205.     GTSC_Visible,    5,        GTSC_Arrows,    16,
  206.     TAG_MORE,    (ULONG)StdGTTags
  207. };
  208.  
  209. struct TagItem PaletteGad[] = {
  210.     GU_GadgetKind,    PALETTE_KIND,    GU_LocaleText,    MSG_SELECTCOL,
  211.     GU_LeftRel,    MSG_SCROLLME,    GU_AddLeft,    INTERWIDTH,
  212.     GU_Flags,    PLACETEXT_ABOVE|NG_HIGHLABEL,
  213.     GU_TopRel,    MSG_SELECTITEM,    GU_AdjustTop,    INTERHEIGHT,
  214.     GU_AlignBottom,    MSG_SCROLLME,    GU_AlignRight,    MSG_SELECTITEM,
  215.     TAG_MORE,    (ULONG)StdGadTags
  216. };
  217.  
  218. struct TagItem PaletteGTTags[] = {
  219.     GTPA_Depth,    2,        GTPA_IndicatorWidth,    36,
  220.     TAG_MORE,    (ULONG)StdGTTags
  221. };
  222.  
  223. struct LayoutGadget gadgets[] = {
  224.     MSG_NEXTDRIVE,    NextDriveGad,    StdGTTags,    NULL,
  225.     MSG_PREVDRIVE,    PrevDriveGad,    StdGTTags,    NULL,
  226.     MSG_DRIVE,    DriveGad,    DriveGTTags,    NULL,
  227.     MSG_REQUESTER,    ReqGad,        StdGTTags,    NULL,
  228.     MSG_CHECKME,    CheckBoxGad,    StdGTTags,    NULL,
  229.     MSG_FILENAME,    FileNameGad,    StdGTTags,    NULL,
  230.     MSG_INTEGER,    IntegerGad,    StdGTTags,    NULL,
  231.     DRIVE_MX_GAD,    DriveMxGad,    MXGadGTTags,    NULL,
  232.     MSG_DRAGME,    SliderGad,    SliderGTTags,    NULL,
  233.     MSG_SELECTITEM,    ListViewGad,    LVGTTags,    NULL,
  234.     MSG_SCROLLME,    ScrollGad,    ScrollGTTags,    NULL,
  235.     MSG_SELECTCOL,    PaletteGad,    PaletteGTTags,    NULL,
  236.     -1,        NULL,        NULL,        NULL
  237. };
  238.  
  239. struct NewMenu MyNewMenu[] = {
  240.      NM_TITLE,    (STRPTR)MNU_1_TITLE,    0,    0,    0,    0,        /* | Project |    */
  241.       NM_ITEM,    (STRPTR)MNI_1_IT1,    0,    0,    0,    (APTR)1,    /* Open [O]    */
  242.       NM_ITEM,    (STRPTR)MNI_1_IT2,    0,    0,    0,    (APTR)2,    /* Save [S]    */
  243.       NM_ITEM,    NM_BARLABEL,        0,    0,    0,    0,        /* -----------    */
  244.       NM_ITEM,    (STRPTR)MNI_1_IT3,    0,    0,    0,    0,        /* Print...    */
  245.        NM_SUB,    (STRPTR)MNS_1_IT3_1,    0,    0,    0,    (APTR)3,    /*      Draft    */
  246.        NM_SUB,    (STRPTR)MNS_1_IT3_2,    0,    0,    0,    (APTR)4,    /*      NLQ    */
  247.       NM_ITEM,    NM_BARLABEL,        0,    0,    0,    0,        /* -----------    */
  248.       NM_ITEM,    (STRPTR)MNI_1_IT4,    0,    0,    0,    (APTR)5,    /* Quit [Q]    */
  249.      NM_END,    NULL,            0,    0,    0,    0
  250. };
  251.  
  252. LONG farright, farbottom;
  253.  
  254. struct TagItem LayoutTags[] = {
  255.     GU_RightExtreme,    (ULONG)&farright,
  256.     GU_LowerExtreme,    (ULONG)&farbottom,
  257.     GU_DefTextAttr,        0,
  258.     GU_Catalog,        0,
  259.     GU_AppStrings,        (ULONG)&AppStrings,
  260.     TAG_DONE
  261. };
  262.  
  263. /*-----------------------------------------------------------------*/
  264. struct Library *GadUtilBase;
  265.  
  266. struct List      LibraryList;
  267. struct Screen *screen = NULL;
  268. struct Window *main_win = NULL;
  269. APTR priv_info = NULL;
  270.  
  271. void process_window_events(struct Window *, struct Menu *);
  272. void ToggleLED(void);
  273.  
  274. main()
  275. {
  276.     struct Gadget *glist;
  277.     struct Menu *menustrip;
  278.     LibraryList = SysBase->LibList;
  279.  
  280.     LVGTTags[0].ti_Data = (ULONG)&LibraryList;
  281.  
  282.     if (GadUtilBase = OpenLibrary("gadutil.library",0))
  283.     {
  284.         LayoutTags[3].ti_Data = (ULONG)GU_OpenCatalog(catalogname,0);
  285.  
  286.         if (screen = LockPubScreen(NULL))
  287.         {
  288.             LayoutTags[2].ti_Data = (ULONG)screen->Font;
  289.  
  290.             if (priv_info = GU_LayoutGadgetsA(&glist, gadgets, screen, LayoutTags))
  291.             {
  292.                 if (main_win = OpenWindowTags(NULL,
  293.                             WA_Left,    0,
  294.                             WA_Top,        screen->Font->ta_YSize + 3,
  295.                             WA_InnerWidth, farright + LEFT_OFFSET,
  296.                             WA_InnerHeight, farbottom + TOP_OFFSET,
  297.                             WA_IDCMP,    LISTVIEWIDCMP | IDCMP_MENUPICK | CYCLEIDCMP |
  298.                                     IDCMP_REFRESHWINDOW | IDCMP_CLOSEWINDOW |
  299.                                     IDCMP_VANILLAKEY | IDCMP_RAWKEY,
  300.                             WA_Flags,    WFLG_DRAGBAR | WFLG_DEPTHGADGET |
  301.                                     WFLG_CLOSEGADGET | WFLG_ACTIVATE |
  302.                                     WFLG_SMART_REFRESH | WFLG_REPORTMOUSE,
  303.                             WA_Gadgets, glist,    WA_NewLookMenus,    TRUE,
  304.                             WA_Title,    "GadUtil library test",
  305.                             TAG_DONE))
  306.                 {
  307.                     GU_RefreshWindow(main_win, NULL);
  308.                     if (menustrip = GU_CreateLocMenuA(MyNewMenu, priv_info,
  309.                             NULL, layoutmenutags))
  310.                     {
  311.                         if (SetMenuStrip(main_win, menustrip))
  312.                         {
  313.                             process_window_events(main_win, menustrip);
  314.                             ClearMenuStrip(main_win);
  315.                         }
  316.                         GU_FreeMenus(menustrip);
  317.                     }
  318.                     CloseWindow(main_win);
  319.                 }
  320.                 GU_FreeLayoutGadgets(priv_info);
  321.             }
  322.             UnlockPubScreen(NULL, screen);
  323.         }
  324.         GU_CloseCatalog((struct Catalog *)LayoutTags[3].ti_Data);
  325.         CloseLibrary((struct Library *)GadUtilBase);
  326.     }
  327. }
  328.  
  329. void process_window_events(struct Window *win, struct Menu *menuStrip)
  330. {
  331.     struct IntuiMessage *imsg;
  332.     struct Gadget *gad, *tempgad;
  333.     struct MenuItem *item;
  334.     BOOL done = FALSE;
  335.     UWORD menunumber;
  336.     ULONG coords;
  337.  
  338.     while (!done)
  339.     {
  340.         Wait(1 << win->UserPort->mp_SigBit);
  341.  
  342.         while ((!done) && (imsg = GU_GetIMsg(win->UserPort)))
  343.         {
  344.             switch (imsg->Class)
  345.             {
  346.                 case IDCMP_GADGETUP:
  347.                     ToggleLED();
  348.                     gad = (struct Gadget *)imsg->IAddress;
  349.                     switch (gad->GadgetID)
  350.                     {
  351.                         case MSG_NEXTDRIVE:
  352.                             if (tempgad = GU_GetGadgetPtr(DRIVE_MX_GAD, gadgets) )
  353.                             {
  354.                                 if ((LONG)MXGadGTTags[2].ti_Data++ >= 3) MXGadGTTags[2].ti_Data = 0;
  355.                                 GU_SetGadgetAttrsA(tempgad, win, NULL, &MXGadGTTags[2]);
  356.                             }
  357.                             break;
  358.  
  359.                         case MSG_PREVDRIVE:
  360.                             if (tempgad = GU_GetGadgetPtr(DRIVE_MX_GAD, gadgets) )
  361.                             {
  362.                                 if ((LONG)MXGadGTTags[2].ti_Data-- <= 0) MXGadGTTags[2].ti_Data = 3;
  363.                                 GU_SetGadgetAttrsA(tempgad, win, NULL, &MXGadGTTags[2]);
  364.                             }
  365.                             break;
  366.  
  367.                         case MSG_REQUESTER:
  368.                             GU_BlockInput(win);
  369.                             Delay(50);
  370.                             GU_FreeInput(win);
  371.                             break;
  372.  
  373.                         case MSG_DRIVE:
  374.                             ToggleLED();
  375.                             break;
  376.                     }
  377.  
  378.                 case IDCMP_GADGETDOWN:
  379.                     gad = (struct Gadget *)imsg->IAddress;
  380.                     if (gad->GadgetID == DRIVE_MX_GAD)
  381.                         MXGadGTTags[2].ti_Data = imsg->Code;
  382.                     break;
  383.  
  384.                 case IDCMP_MOUSEMOVE:
  385.                     if (tempgad = GU_GetGadgetPtr(MSG_SELECTITEM, gadgets))
  386.                     {
  387.                         coords = (LONG)imsg->MouseX<<16|imsg->MouseY;
  388.  
  389.                         if (GU_CoordsInGadBox(coords,tempgad))
  390.                         {
  391.                             ToggleLED();
  392.                         }
  393.                     }
  394.                     break;
  395.  
  396.                 case IDCMP_MENUPICK:
  397.                     menunumber = imsg->Code;
  398.  
  399.                     while ((menunumber != MENUNULL) && (!done))
  400.                     {
  401.                         item = ItemAddress(menuStrip, menunumber);
  402.  
  403.                         if ( (LONG)GTMENUITEM_USERDATA(item) == 5)
  404.                             done = TRUE;
  405.  
  406.                         menunumber = item->NextSelect;
  407.                     }
  408.                     break;
  409.  
  410.                 case IDCMP_CLOSEWINDOW:
  411.                     done = TRUE;
  412.                     break;
  413.  
  414.                 case IDCMP_REFRESHWINDOW:
  415.                     GU_BeginRefresh(win);
  416.                     GU_EndRefresh(win, TRUE);
  417.                     break;
  418.             }
  419.             GU_ReplyIMsg(imsg);
  420.         }
  421.     }
  422. }
  423.